#ifndef __LINKTREE_H_
#define __LINKTREE_H_

#include <string>
#include "DynamicArray.h"

using ElementType = std::string;
class TreeNode
{
public:
    TreeNode(const ElementType &element);
    // 将节点绑定为另一个节点的孩子
    void Connect(TreeNode *parent);
    // 解绑
    void DisConnect(TreeNode *parent);

    static TreeNode *FindNode(TreeNode *node, const ElementType &element);
    static void FindNode(TreeNode *node, const ElementType &element, DArray::DynamicArray &a);

    static void FreeNode(TreeNode *node);
    static int GetNodeHeight(TreeNode *node);
    void show(TreeNode *node, int depth);
    TreeNode *GetParent(); // 获取双亲指针
    std::string &GetData();
    void SetData(const ElementType &element);

private:
    ElementType data;     // 数据域
    TreeNode *parent;     // 双亲指针
    TreeNode *FirstChild; // 第一个孩子指针
    TreeNode *nextSbling; // 下一个兄弟指针
};

class LinkTree
{
public:
    LinkTree();
    LinkTree(const ElementType &element);
    ~LinkTree();
    TreeNode *GetRoot(); // 获取根节点地址
    void show();
    DArray::DynamicArray FindByElement(const ElementType &element);
    int GetTreeHeight();
    std::string GetNodePath(TreeNode *node);

private:
    TreeNode *root; // 根节点
};

#endif
